import {
  ValidatorConstraint,
  ValidatorConstraintInterface,
  registerDecorator,
  ValidationOptions,
  isEmail,
  ValidationArguments,
} from 'class-validator';

// 黑名单域名
const BLACKLIST_DOMAINS = ['temp.com', 'test.com'];

@ValidatorConstraint({ name: 'IsEmailRw', async: false })
export class MyEmail implements ValidatorConstraintInterface {
  validate(email: string, args: ValidationArguments) {
    // 继承基础邮箱验证
    if (!isEmail(email)) {
      return false;
    }

    // 重写扩展
    const domain = email.split('@')[1];
    return !BLACKLIST_DOMAINS.includes(domain);
  }

  defaultMessage(args: ValidationArguments) {
    return `${args.property} 邮箱格式不符合要求`;
  }
}

// 导出一个函数isEmailr，用于验证邮箱地址
export function IsEmailRw(validationOptions?: ValidationOptions) {
  // 返回一个函数，该函数接受一个对象和一个属性名作为参数
  return function (object: object, propertyName: string) {
    // 注册一个装饰器，用于验证邮箱地址
    registerDecorator({
      // 设置装饰器的目标为对象的构造函数
      target: object.constructor,
      // 设置装饰器的属性名为传入的属性名
      propertyName: propertyName,
      // 设置装饰器的选项为传入的选项
      options: validationOptions,
      // 设置装饰器的约束为空数组
      constraints: [],
      // 设置装饰器的验证器为MyEmail
      validator: MyEmail,
    });
  };
}

// 使用
// export class UserDto {
//   @IsEmailRw()
//   email: string;
// }
